cssrgbavalue: Add a singleton for transparent colors
authorTimm Bäder <mail@baedert.org>
Sat, 17 Aug 2019 17:53:32 +0000 (19:53 +0200)
committerTimm Bäder <mail@baedert.org>
Mon, 9 Sep 2019 15:36:23 +0000 (17:36 +0200)
The most common background color is no background color.

gtk/gtkcsscolorvalue.c
gtk/gtkcssrgbavalue.c
gtk/gtkcssrgbavalueprivate.h
gtk/gtkcssshadowvalue.c
gtk/gtkcssstylepropertyimpl.c

index 617f92bdc1c26c24ceb33c67319bc4ae218e574d..091cb07c856371c1774f67a5c3db026aa023345a 100644 (file)
@@ -97,8 +97,6 @@ gtk_css_value_color_get_fallback (guint             property_id,
                                   GtkCssStyle      *style,
                                   GtkCssStyle      *parent_style)
 {
-  static const GdkRGBA transparent = { 0, 0, 0, 0 };
-
   switch (property_id)
     {
       case GTK_CSS_PROPERTY_BACKGROUND_IMAGE:
@@ -106,7 +104,7 @@ gtk_css_value_color_get_fallback (guint             property_id,
       case GTK_CSS_PROPERTY_TEXT_SHADOW:
       case GTK_CSS_PROPERTY_ICON_SHADOW:
       case GTK_CSS_PROPERTY_BOX_SHADOW:
-        return _gtk_css_rgba_value_new_from_rgba (&transparent);
+        return _gtk_css_rgba_value_new_transparent ();
       case GTK_CSS_PROPERTY_COLOR:
       case GTK_CSS_PROPERTY_BACKGROUND_COLOR:
       case GTK_CSS_PROPERTY_BORDER_TOP_COLOR:
@@ -127,7 +125,7 @@ gtk_css_value_color_get_fallback (guint             property_id,
         if (property_id < GTK_CSS_PROPERTY_N_PROPERTIES)
           g_warning ("No fallback color defined for property '%s'", 
                      _gtk_style_property_get_name (GTK_STYLE_PROPERTY (_gtk_css_style_property_lookup_by_id (property_id))));
-        return _gtk_css_rgba_value_new_from_rgba (&transparent);
+        return _gtk_css_rgba_value_new_transparent ();
     }
 }
 
index a7134ef46541a16c974960e73037ac58fd57bf25..f840160bde9ae38adbc270d37e63242c01a1eda5 100644 (file)
@@ -107,6 +107,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_RGBA = {
   gtk_css_value_rgba_print
 };
 
+static GtkCssValue transparent_black_singleton = (GtkCssValue) { &GTK_CSS_VALUE_RGBA, 1, { 0, 0, 0, 0 }};
+static GtkCssValue transparent_white_singleton = (GtkCssValue) { &GTK_CSS_VALUE_RGBA, 1, { 1, 1, 1, 0 }};
+
 GtkCssValue *
 _gtk_css_rgba_value_new_from_rgba (const GdkRGBA *rgba)
 {
@@ -114,12 +117,31 @@ _gtk_css_rgba_value_new_from_rgba (const GdkRGBA *rgba)
 
   g_return_val_if_fail (rgba != NULL, NULL);
 
+  if (gdk_rgba_is_clear (rgba))
+    {
+      if (rgba->red == 1 &&
+          rgba->green == 1 &&
+          rgba->blue == 1)
+        return _gtk_css_value_ref (&transparent_white_singleton);
+
+      if (rgba->red == 0 &&
+          rgba->green == 0 &&
+          rgba->blue == 0)
+        return _gtk_css_value_ref (&transparent_black_singleton);
+    }
+
   value = _gtk_css_value_new (GtkCssValue, &GTK_CSS_VALUE_RGBA);
   value->rgba = *rgba;
 
   return value;
 }
 
+GtkCssValue *
+_gtk_css_rgba_value_new_transparent (void)
+{
+  return _gtk_css_value_ref (&transparent_black_singleton);
+}
+
 const GdkRGBA *
 _gtk_css_rgba_value_get_rgba (const GtkCssValue *rgba)
 {
index 60a0cffd6f8e8cefb7c766e169e5d0f3ab356890..56760c275e16936f04427793952bac7b613065f4 100644 (file)
@@ -26,7 +26,8 @@
 
 G_BEGIN_DECLS
 
-GtkCssValue *   _gtk_css_rgba_value_new_from_rgba (const GdkRGBA          *rgba);
+GtkCssValue *   _gtk_css_rgba_value_new_from_rgba   (const GdkRGBA          *rgba);
+GtkCssValue *   _gtk_css_rgba_value_new_transparent (void);
 
 const GdkRGBA * _gtk_css_rgba_value_get_rgba      (const GtkCssValue      *rgba) G_GNUC_PURE;
 
index f0b2fc243d0f65d368b05edbf9bb5c6c3e9ea3c7..d2febe75228490820613ac456ace8ba983913e79 100644 (file)
@@ -189,8 +189,6 @@ gtk_css_shadow_value_new (GtkCssValue *hoffset,
 GtkCssValue *
 _gtk_css_shadow_value_new_for_transition (GtkCssValue *target)
 {
-  GdkRGBA transparent = { 0, 0, 0, 0 };
-
   g_return_val_if_fail (target->class == &GTK_CSS_VALUE_SHADOW, NULL);
 
   return gtk_css_shadow_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
@@ -198,7 +196,7 @@ _gtk_css_shadow_value_new_for_transition (GtkCssValue *target)
                                    _gtk_css_number_value_new (0, GTK_CSS_PX),
                                    _gtk_css_number_value_new (0, GTK_CSS_PX),
                                    target->inset,
-                                   _gtk_css_rgba_value_new_from_rgba (&transparent));
+                                   _gtk_css_rgba_value_new_transparent ());
 }
 
 enum {
index a1987b751a4c01d40dea8e0ab9730d51a50d3461..af2869121b86aaa16fff3cdf0cec5ff8fcd4b9a3 100644 (file)
@@ -991,7 +991,7 @@ _gtk_css_style_property_init_properties (void)
                                           GTK_CSS_AFFECTS_BACKGROUND,
                                           color_parse,
                                           color_query,
-                                          _gtk_css_color_value_new_rgba (0, 0, 0, 0));
+                                          _gtk_css_rgba_value_new_transparent ());
 
   gtk_css_style_property_register        ("font-family",
                                           GTK_CSS_PROPERTY_FONT_FAMILY,